#ifndef __CAPAINDICES_CONDICIONES_H
#define __CAPAINDICES_CONDICIONES_H

/*****************************************************************************
*                     Organizaci�n de Datos - 75.06                          *
*                         C�tedra Lic. Servetto                              *
*            Facultad de Ingenier�a - Universidad de Buenos Aires            *
******************************************************************************/

#include "Archivo.h"

using namespace std;
using namespace Comun;

namespace Comun
{
	/*****************************************************************************
	*                               Condiciones                                  *
	******************************************************************************/

	enum TipoSimbolo
	{
		Igual,
		Mayor,
		MayorIgual,
		Menor,
		MenorIgual,
		And,
		Or
	};


	// Clase abstracta que representa una condicion sobre un campo determinado de una clave de indice,
	// la cual se verifica utilizando el metodo Analizar.
	class Condicion
	{
	public:
		// Valor contra el que tiene que validar, en el caso de que no se especifique otro;
		Atributo ValorCondicion;
		TipoSimbolo Simbolo;
		~Condicion(){}

		// Analiza si los valores presentes en 'valor' cumple con la condicion
		virtual bool Analizar(list<Atributo> atributos, list<string> valores) = 0;
		// Analiza si el registro cumple con la condicion. El valor es implicito.
		virtual bool Analizar(Registro registro) = 0;

		string getSimbolo();

		bool esIgual(TipoRegistro tipo, string valor1, string valor2);

		string NombreClase;

	};

	// Implementa una condicion que se compone del resultado de un conjunto de subcondiciones
	class CondicionCompuesta : public Condicion
	{
	public:
		CondicionCompuesta();
		virtual ~CondicionCompuesta();
		virtual bool Analizar(list<Atributo> atributos, list<string> valores);
		virtual bool Analizar(Registro registro);
		virtual bool EsAnd();
		list<Condicion*> Subcondiciones;

	};
	
	
	// Implementa una condicion de tipo 'Menor a'
	class CondicionMenor : public Condicion
	{
		public:
		CondicionMenor();
		~CondicionMenor();
		bool Analizar(list<Atributo> atributos, list<string> valores);
		bool Analizar(Registro registro);
		bool esMenor(TipoRegistro tipo, string valor1, string valor2);
	};

	// Implementa una condicion de tipo 'Menor o igual a'
	class CondicionMenorIgual : public Condicion
	{
		public:
		CondicionMenorIgual();
		~CondicionMenorIgual();
		bool Analizar(list<Atributo> atributos, list<string> valores);
		bool Analizar(Registro registro);
		bool esMenorIgual(TipoRegistro tipo, string valor1, string valor2);
	};

	// Implementa una condicion de tipo 'Mayor a'
	class CondicionMayor : public Condicion
	{
	public:
		CondicionMayor();
		~CondicionMayor();
		bool Analizar(list<Atributo> atributos, list<string> valores);
		bool Analizar(Registro registro);
		bool esMayor(TipoRegistro tipo, string valor1, string valor2);
	};

	// Implementa una condicion de tipo 'Mayor o igual a'
	class CondicionMayorIgual : public Condicion
	{
	public:
		CondicionMayorIgual();
		~CondicionMayorIgual();
		bool Analizar(list<Atributo> atributos, list<string> valores);
		bool Analizar(Registro registro);
		bool esMayorIgual(TipoRegistro tipo, string valor1, string valor2);
	};

	// Implementa una condicion de tipo 'Igual a'
	class CondicionIgual : public Condicion
	{
	public:
		CondicionIgual();
		~CondicionIgual();
		bool Analizar(list<Atributo> atributos, list<string> valores);
		bool Analizar(Registro registro);	
		
	};



	// Implementa una condicion compuesta que se cumple si y solo si se cumplen TODAS las subcondiciones.
	class CondicionCompuestaAND : public CondicionCompuesta
	{
	public:
		CondicionCompuestaAND();
		~CondicionCompuestaAND();
		virtual bool EsAnd();

	};

	// Implementa una condicion compuesta que se cumple si y solo si se cumple ALGUNA de las subcondiciones.
	class CondicionCompuestaOR : public CondicionCompuesta
	{
		public:
		CondicionCompuestaOR();
		~CondicionCompuestaOR();
		virtual bool Analizar(list<Atributo> atributos, list<string> valores);
		virtual bool Analizar(Registro registro);
		virtual bool EsAnd();
	};

}

#endif
